package com.summer.safe.system.service;

import com.summer.safe.system.dao.MenuDao;
import com.summer.safe.system.dao.RoleDao;
import com.summer.safe.system.dao.UserDao;
import com.summer.safe.utils.*;
import com.summer.safe.config.result.ResultCode;
import com.summer.safe.exception.CustomException;
import com.summer.safe.system.entity.Office;
import com.summer.safe.utils.*;
import com.summer.safe.system.entity.Menu;
import com.summer.safe.system.entity.Role;
import com.summer.safe.system.entity.User;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static com.summer.safe.utils.UserUtils.getCache;


/**
 * 系统服务
 */
@Service
public class SystemService {

    protected Logger logger = LoggerFactory.getLogger(getClass());
   /**
     * 加盐参数
     */
    public static final String HASH_ALGORITHM = "SHA-1";
    /**
     * 循环次数
     */
    public final static int HASH_INTERATIONS = 1024;

    public static final String CACHE_MENU_NAME_PATH_MAP = "menuNamePathMap";



        @Autowired
        private UserDao userDao;
        @Autowired
        private RoleDao roleDao;
        @Autowired
        private MenuDao menuDao;

    /**
     * 根据用户名获得用户信息
     * @param loginName
     * @return
     */
    public User getByLoginName(String loginName) {
        User user = userDao.getByLoginName(loginName);
        if (null != user) {
            user.setRoleList(roleDao.getByUserId(user.getId()));
        }
        return user;
    }


    /**
     * 根据id获得用户信息 获取用户,直接从数据库查
     *
     * @param  id
     * @return
     */
    public User get(String id) {
        User user =  userDao.get(id);
        user.setRoleList(roleDao.findList(new Role(user)));
        return  user;
    }

    @Transactional(rollbackFor = Exception.class)
    public void saveUser(User user) {
        try {
            if (StringUtils.isBlank(user.getId())) {
                user.setPassword(MD5Util.entryptPassword("123456"));
                user.preInsert();
                userDao.insert(user);
            } else {
                // 清除原用户机构用户缓存
                User oldUser = userDao.get(user.getId());
                if (oldUser.getOffice() != null && oldUser.getOffice().getId() != null) {
                    CacheUtils.remove(Global.USER_CACHE, Global.USER_CACHE_LIST_BY_OFFICE_ID_ + oldUser.getOffice().getId());
                }
                // 更新用户数据
                user.preUpdate();
                userDao.update(user);
            }
            if (StringUtils.isNotBlank(user.getId())) {
                // 更新用户与角色关联
                userDao.deleteUserRole(user);
                if (user.getRoleList() != null && user.getRoleList().size() > 0) {
                    userDao.insertUserRole(user);
                } else {
                    throw new ServiceException(user.getLoginName() + "没有设置角色！");
                }
            }
        }catch ( Exception ex){
            logger.error("抛出的异常{}", ex.getMessage());
            throw new CustomException(ResultCode.FAIL_SAVE);
        }
        // 清除用户缓存
        UserUtils.clearCache(user);
    }

    @Transactional(rollbackFor = Exception.class)
    public void saveMenu(Menu menu) {
        try {
        // 获取父节点实体
        menu.setParent(this.getMenu(menu.getParent().getId()));

        // 获取修改前的parentIds，用于更新子节点的parentIds
        String oldParentIds = menu.getParentIds();
        // 设置新的父节点串
        menu.setParentIds(menu.getParent().getParentIds() + menu.getParent().getId() + ",");
        // 保存或更新实体
        if (StringUtils.isBlank(menu.getId())) {
            menu.preInsert();
            menuDao.insert(menu);
        } else {
            menu.preUpdate();
            menuDao.update(menu);
        }

        // 更新子节点 parentIds
        Menu m = new Menu();
        m.setParentIds("%," + menu.getId() + ",%");
        List<Menu> list = menuDao.findByParentIdsLike(m);
        for (Menu e : list) {
                e.setParentIds(e.getParentIds().replace(oldParentIds, menu.getParentIds()));
                menuDao.updateParentIds(e);
                }
        }catch ( Exception ex){
            logger.error("抛出的异常{}", ex.getMessage());
            throw new CustomException(ResultCode.FAIL_SAVE);
        }
        // 清除用户菜单缓存
        UserUtils.removeCache(Global.CACHE_MENU_LIST);
        // 清除日志相关缓存
        CacheUtils.remove(SystemService.CACHE_MENU_NAME_PATH_MAP);
    }

    public void updateMenuSort(Menu menu) {
        menuDao.updateSort(menu);
        // 清除用户菜单缓存
        UserUtils.removeCache(Global.CACHE_MENU_LIST);
        // 清除日志相关缓存
        CacheUtils.remove(SystemService.CACHE_MENU_NAME_PATH_MAP);
    }

    public void deleteMenu(Menu menu) {
        menuDao.delete(menu);
        // 清除用户菜单缓存
        UserUtils.removeCache(Global.CACHE_MENU_LIST);
        // 清除日志相关缓存
        CacheUtils.remove(SystemService.CACHE_MENU_NAME_PATH_MAP);
    }


    /**
     * 提交角色信息
     * @param role
     */
    @Transactional(readOnly = false)
        public void saveRole(Role role) {
        try{
            if (StringUtils.isBlank(role.getId())) {
                role.preInsert();
                roleDao.insert(role);
            } else {
                role.preUpdate();
                roleDao.update(role);
            }
            // 更新角色与菜单关联
            roleDao.deleteRoleMenu(role);
            if (role.getMenuList().size() > 0) {
                roleDao.insertRoleMenu(role);
            }
        }catch ( Exception ex){
            logger.error("抛出的异常{}", ex.getMessage());
            throw new CustomException(ResultCode.FAIL_SAVE);
        }

        //清除角色的缓存
        UserUtils.removeCache(Global.CACHE_ROLE_LIST);
        //角色的菜单
        UserUtils.removeCache(Global.CACHE_MENU_LIST);



        }


    /**
     * 提交角色-部门
     * @param role
     */
    @Transactional(readOnly = false)
    public void saveRoleOffice(Role role) {
        try {
        roleDao.updateDataScope(role);
        // 更新角色与菜单关联
        roleDao.deleteRoleOffice(role);
            if (role.getOfficeList().size() > 0) {
                roleDao.insertRoleOffice(role);
            }
        }catch ( Exception ex){
            logger.error("抛出的异常{}", ex.getMessage());
            throw new CustomException(ResultCode.FAIL_SAVE);
        }
        // 清除用户权限菜单
        UserUtils.removeCache(Global.CACHE_ROLE_LIST);
        //清除角色的部门的缓存
        UserUtils.removeCache(Global.CACHE_OFFICE_LIST);
    }

        /**
         * 获取当前用户角色列表
         * @return
         */
        public List<Role> findAllRole() {
            return UserUtils.getRoleList();
        }

        /**
         * 获取当前用户授权菜单
         * @return
         */
        public List<Menu> findAllMenu() {
            return UserUtils.getMenuList();
        }

        /**
         * 获取当前用户授权部门
         * @return
         */
        public List<Office> findAllOffice() {
            return UserUtils.getOfficeList();
        }

        public Menu getMenu(String id) {
            return menuDao.get(id);
        }





}
